import traceback
from mui.CExt.CW32Window import *

_vk2str_map = {VK_LBUTTON: 'LBUTTON',
    VK_RBUTTON : 'RBUTTON',
    VK_CANCEL : 'CANCEL',
    VK_MBUTTON : 'MBUTTON',
    VK_BACK : 'BACK',
    VK_TAB : 'TAB',
    VK_CLEAR : 'CLEAR',
    VK_RETURN : 'ENTER',
    #VK_SHIFT : 'SHIFT',
    #VK_CONTROL : 'CTRL',
    #VK_MENU : 'MENU',
    VK_PAUSE : 'PAUSE',
    #VK_CAPITAL : 'CAPITAL',
    VK_KANA : 'KANA',
    VK_HANGEUL :'HANKEUL',
    VK_HANGUL : 'HANGUL',
    VK_JUNJA : 'JUNJA',
    VK_FINAL : 'FINAL',
    VK_HANJA : 'HANJA',
    VK_KANJI : 'KANJI',
    VK_ESCAPE : 'ESC',
    VK_CONVERT : 'CONVERT',
    VK_NONCONVERT : 'NONCONVERT',
    VK_ACCEPT : 'ACCEPT',
    VK_MODECHANGE : 'MODECHANGE',
    VK_SPACE : 'SPACE',
    VK_PRIOR : 'PRIOR',
    VK_NEXT : 'NEXT',
    VK_END : 'END',
    VK_HOME : 'HOME',
    VK_LEFT : 'LEFT',
    VK_UP : 'UP',
    VK_RIGHT : 'RIGHT',
    VK_DOWN : 'DOWN',
    VK_SELECT : 'SELECT',
    VK_PRINT : 'PRINT',
    VK_EXECUTE : 'EXECUTE',
    VK_SNAPSHOT : 'SNAPSHOT',
    VK_INSERT : 'INSERT',
    VK_DELETE : 'DELETE',
    VK_HELP : 'HELP',
    #VK_LWIN : 'LWIN',
    #VK_RWIN : 'RWIN',
    VK_APPS : 'APPS',
    VK_SLEEP : 'SLEEP',
    VK_NUMPAD0 : 'NUMPAD0',
    VK_NUMPAD1 : 'NUMPAD1',
    VK_NUMPAD2 : 'NUMPAD2',
    VK_NUMPAD3 : 'NUMPAD3',
    VK_NUMPAD4 : 'NUMPAD4',
    VK_NUMPAD5 : 'NUMPAD5',
    VK_NUMPAD6 : 'NUMPAD6',
    VK_NUMPAD7 : 'NUMPAD7',
    VK_NUMPAD8 : 'NUMPAD8',
    VK_NUMPAD9 : 'NUMPAD9',
    VK_MULTIPLY : 'MULTIPLY',
    VK_ADD : 'ADD',
    VK_SEPARATOR : 'SEPARATOR',
    VK_SUBTRACT : 'SUBTRACT',
    VK_DECIMAL : 'DECIMAL',
    VK_DIVIDE : 'DIVIDE',
    VK_F1 : 'F1',
    VK_F2 : 'F2',
    VK_F3 : 'F3',
    VK_F4 : 'F4',
    VK_F5 : 'F5',
    VK_F6 : 'F6',
    VK_F7 : 'F7',
    VK_F8 : 'F8',
    VK_F9 : 'F9',
    VK_F10 : 'F10',
    VK_F11 : 'F11',
    VK_F12 : 'F12',
    VK_F13 : 'F13',
    VK_F14 : 'F14',
    VK_F15 : 'F15',
    VK_F16 : 'F16',
    VK_F17 : 'F17',
    VK_F18 : 'F18',
    VK_F19 : 'F19',
    VK_F20 : 'F20',
    VK_F21 : 'F21',
    VK_F22 : 'F22',
    VK_F23 : 'F23',
    VK_F24 : 'F24',
    VK_NUMLOCK : 'NUMLOCK',
    VK_SCROLL : 'SCROLL',
    VK_OEM_NEC_EQUAL : 'OEM_NEC_EQUAL',
    VK_OEM_FJ_JISHO : 'OEM_FJ_JISHO',
    VK_OEM_FJ_MASSHOU : 'OEM_FJ_MASSHOU',
    VK_OEM_FJ_TOUROKU : 'OEM_FJ_TOUROKU',
    VK_OEM_FJ_LOYA : 'OEM_FJ_LOYA',
    VK_OEM_FJ_ROYA : 'OEM_FJ_ROYA',
    VK_LSHIFT : 'LSHIFT',
    VK_RSHIFT : 'RSHIFT',
    #VK_LCONTROL : 'LCONTROL',
    #VK_RCONTROL : 'RCONTROL',
    #VK_LMENU : 'LMENU',
    #VK_RMENU : 'RMENU',
    VK_OEM_1 : 'OEM_1',
    VK_OEM_PLUS : 'OEM_PLUS',
    VK_OEM_COMMA : 'OEM_COMMA',
    VK_OEM_MINUS : 'OEM_MINUS',
    VK_OEM_PERIOD : 'OEM_PERIOD',
    VK_OEM_2 : 'OEM_2',
    VK_OEM_3 : 'OEM_3',
    VK_OEM_4 : 'OEM_4',
    VK_OEM_5 : 'OEM_5',
    VK_OEM_6 : 'OEM_6',
    VK_OEM_7 : 'OEM_7',
    VK_OEM_8 : 'OEM_8',
    VK_OEM_AX : 'OEM_AX',
    VK_OEM_102 : 'OEM_102',
    VK_ICO_HELP : 'ICO_HELP',
    VK_ICO_00 : 'ICO_00',
    VK_ICO_CLEAR : 'ICO_CLEAR',
    VK_OEM_RESET : 'OEM_RESET',
    VK_OEM_JUMP : 'OEM_JUMP',
    VK_OEM_PA1 : 'OEM_PA1',
    VK_OEM_PA2 : 'OEM_PA2',
    VK_OEM_PA3 : 'OEM_PA3',
    VK_OEM_WSCTRL : 'OEM_WSCTRL',
    VK_OEM_CUSEL : 'OEM_CUSEL',
    VK_OEM_ATTN : 'OEM_ATTN',
    VK_OEM_FINISH : 'OEM_FINISH',
    VK_OEM_COPY : 'OEM_COPY',
    VK_OEM_AUTO : 'OEM_AUTO',
    VK_OEM_ENLW : 'OEM_ENLW',
    VK_OEM_BACKTAB : 'OEM_BACKTAB',
    VK_ATTN : 'ATTN',
    VK_CRSEL : 'CRSEL',
    VK_EXSEL : 'EXSEL',
    VK_EREOF : 'EREOF',
    VK_PLAY : 'PLAY',
    VK_ZOOM : 'ZOOM',
    VK_NONAME : 'NONAME',
    VK_PA1 : 'PA1',
    VK_OEM_CLEAR : 'OEM_CLEAR',
    VK_0 : '0',
    VK_1 : '1',
    VK_2 : '2',
    VK_3 : '3',
    VK_4 : '4',
    VK_5 : '5',
    VK_6 : '6',
    VK_7 : '7',
    VK_8 : '8',
    VK_9 : '9',
    VK_A : 'A',
    VK_B : 'B',
    VK_C : 'C',
    VK_D : 'D',
    VK_E : 'E',
    VK_F : 'F',
    VK_G : 'G',
    VK_H : 'H',
    VK_I : 'I',
    VK_J : 'J',
    VK_K : 'K',
    VK_L : 'L',
    VK_M : 'M',
    VK_N : 'N',
    VK_O : 'O',
    VK_P : 'P',
    VK_Q : 'Q',
    VK_R : 'R',
    VK_S : 'S',
    VK_T : 'T',
    VK_U : 'U',
    VK_V : 'V',
    VK_W : 'W',
    VK_X : 'X',
    VK_Y : 'Y',
    VK_Z : 'Z'
}

_str2vk_map = {}

for k, v in _vk2str_map.items():
    _str2vk_map[v] = k

_mod2str_map = {
    MOD_ALT : 'ALT',
    MOD_CTRL : 'CTRL',
    MOD_SHIFT : 'SHIFT',
    MOD_WINDOWS : 'WIN',
    MOD_CAPSLOCK : 'CAPSLOCK',
    MOD_NUMLOCK : 'NUMLOCK'
}
_mk2str_map = \
    {
    MK_LBUTTON : 'LBUTTON',
    MK_RBUTTON :  'RBUTTON',
    MK_SHIFT :  'SHIFT',
    MK_CONTROL :  'CONTROL',
    MK_MBUTTON :  'MBUTTON',
    MK_XBUTTON1 :  'XBUTTON1',
    MK_XBUTTON2 :  'XBUTTON2',
}

def keyStr(symbol, modifier):
    key = ''
    for k, v in _mod2str_map.items():
        if modifier & k:
            if key:
                key += ' '
            key += v
    if symbol:
        if key:
            key += ' '
        key += _vk2str_map.get(symbol, '')

    return key

def keyStr2Symbol(_key):
    key = _key.upper()
    symbol = None
    modifiers = 0
    for k, v in _mod2str_map.items():
        if (key.find(v) >= 0):
            modifiers = modifiers | k
            key = key.replace(v, '')
    key = key.replace(' ', '')
    symbol = _str2vk_map.get(key, None)
    return symbol, modifiers

